bitkeeper revision 1.1236.1.129 (4243752dhyR6gFbwnTLGvPXHdYlWoA)
authordjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Thu, 24 Mar 2005 22:16:25 +0000 (22:16 +0000)
committerdjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Thu, 24 Mar 2005 22:16:25 +0000 (22:16 +0000)
xensetup.c, domain.c, config.h, hypercall.c:
  Add (tmp) domain loading hypercalls

xen/arch/ia64/domain.c
xen/arch/ia64/hypercall.c
xen/arch/ia64/xensetup.c
xen/include/asm-ia64/config.h

index 746cc87268659487c1761149c38f7218919e4f9d..3e889eb8d4d08e5f9a459c07abe96f082dac58d7 100644 (file)
@@ -38,6 +38,12 @@ unsigned long dom0_start = -1L;
 unsigned long dom0_size = 512*1024*1024; //FIXME: Should be configurable
 //FIXME: alignment should be 256MB, lest Linux use a 256MB page size
 unsigned long dom0_align = 64*1024*1024;
+#ifdef DOMU_BUILD_STAGING
+unsigned long domU_staging_size = 32*1024*1024; //FIXME: Should be configurable
+unsigned long domU_staging_start;
+unsigned long domU_staging_align = 64*1024;
+unsigned long *domU_staging_area;
+#endif
 
 // initialized by arch/ia64/setup.c:find_initrd()
 unsigned long initrd_start = 0, initrd_end = 0;
@@ -542,6 +548,37 @@ void alloc_dom0(void)
 
 }
 
+#ifdef DOMU_BUILD_STAGING
+void alloc_domU_staging(void)
+{
+       domU_staging_size = 32*1024*1024; //FIXME: Should be configurable
+       printf("alloc_domU_staging: starting (initializing %d MB...)\n",domU_staging_size/(1024*1024));
+       domU_staging_start= alloc_boot_pages(domU_staging_size,domU_staging_align);
+       if (!domU_staging_size) {
+               printf("alloc_domU_staging: can't allocate, spinning...\n");
+               while(1);
+       }
+       else domU_staging_area = (unsigned long *)__va(domU_staging_start);
+       printf("alloc_domU_staging: domU_staging_start=%p\n",domU_staging_start);
+
+}
+
+unsigned long
+domU_staging_write_32(unsigned long at, unsigned long a, unsigned long b,
+       unsigned long c, unsigned long d)
+{
+       if (at + 32 > domU_staging_size) return -1;
+       if (at & 0x1f) return -1;
+       at >>= 5;
+       domU_staging_area[at++] = a;
+       domU_staging_area[at++] = b;
+       domU_staging_area[at++] = c;
+       domU_staging_area[at] = d;
+       return 0;
+       
+}
+#endif
+
 int construct_dom0(struct domain *d, 
                       unsigned long image_start, unsigned long image_len, 
                       unsigned long initrd_start, unsigned long initrd_len,
@@ -722,7 +759,7 @@ if (d == dom0)
 }
 
 // FIXME: When dom0 can construct domains, this goes away (or is rewritten)
-int construct_domN(struct domain *d,
+int construct_domU(struct domain *d,
                   unsigned long image_start, unsigned long image_len,
                   unsigned long initrd_start, unsigned long initrd_len,
                   char *cmdline)
@@ -774,20 +811,19 @@ int construct_domN(struct domain *d,
 }
 
 // FIXME: When dom0 can construct domains, this goes away (or is rewritten)
-int launch_domainN(unsigned long start, unsigned long len,
-                  unsigned long initrd_start, unsigned long initrd_len,
-                  char *cmdline)
+int launch_domainU(unsigned long size)
 {
        static int next = 100;  // FIXME
 
        struct domain *d = do_createdomain(next,0);
        if (!d) {
-               printf("launch_domainN: couldn't create\n");
+               printf("launch_domainU: couldn't create\n");
                return 1;
        }
-       if (construct_domN(d, start, len, 0, 0, 0)) {
-               printf("launch_domainN: couldn't construct(id=%d,%lx,%lx)\n",
-                       d->id,start,len);
+       else next++;
+       if (construct_domU(d, (unsigned long)domU_staging_area, size,0,0,0)) {
+               printf("launch_domainU: couldn't construct(id=%d,%lx,%lx)\n",
+                       d->id,domU_staging_area,size);
                return 2;
        }
        domain_unpause_by_systemcontroller(d);
index d5eb2550658f21fd87c5bc920eee010a341b9dc1..c87921a75565462f5455dda697590ec75a7f78d9 100644 (file)
@@ -89,10 +89,19 @@ ia64_hypercall (struct pt_regs *regs)
                        vcpu_get_gr(ed,32),
                        vcpu_get_gr(ed,33));
                break;
+#ifdef DOMU_BUILD_STAGING
            case 0xfffd: // test dummy hypercall
-               regs->r8 = launch_domainN(
+               regs->r8 = launch_domainU(
+                       vcpu_get_gr(ed,32));
+               break;
+           case 0xfffc: // test dummy hypercall
+               regs->r8 = domU_staging_write_32(
                        vcpu_get_gr(ed,32),
-                       vcpu_get_gr(ed,33), 0, 0, 0);
+                       vcpu_get_gr(ed,33),
+                       vcpu_get_gr(ed,34),
+                       vcpu_get_gr(ed,35),
+                       vcpu_get_gr(ed,36));
                break;
+#endif
        }
 }
index babf560ba4fb47571310f1922268e042089968dd..211e1af7fd4612417abba1ccf70d45e26c0194a3 100644 (file)
@@ -224,6 +224,9 @@ void cmain(multiboot_info_t *mbi)
     init_frametable();
 
     alloc_dom0();
+#ifdef DOMU_BUILD_STAGING
+    alloc_domU_staging();
+#endif
 
     end_boot_allocator();
 
index f746990b15fcd5188da6a768ab671fe030a7c173..c2b831a978599bee85be6555547c0b7b5155a7d1 100644 (file)
@@ -1,6 +1,7 @@
 // control flags for turning on/off features under test
 #undef CLONE_DOMAIN0
 //#define CLONE_DOMAIN0 5
+#define DOMU_BUILD_STAGING
 
 // manufactured from component pieces